public class test07 {
    class Solution {
        List<List<Integer>> res;
        List<Integer> list;
        //此处不能使用boolean[]的原因
        //每层都要单独控制，不能说一层用过了，就代表一直用过
        //boolean[] used;
        public List<List<Integer>> findSubsequences(int[] nums) {
            res = new ArrayList<>();
            list = new ArrayList<>();
            //used = new boolean[nums.length];
            //Arrays.fill(used,false);
            backTracking(nums,0);
            return res;
        }
        private void backTracking(int[] nums,int start){
            //将 used 放在 backTracking 方法内部会导致每次递归时 used 数组被重置
            if(list.size()>=2){
                res.add(new ArrayList(list));
                //return;
                //这里如果加了return，就到不了下面的重建一个hashset的代码了
            }
            Set<Integer> used = new HashSet<>();
            for(int i = start;i<nums.length;i++){
                // boolean[] used = new boolean[nums.length];
                // Arrays.fill(used,false);
                //跟是否连在一起无关 比如[4,7,6,7]
                //也只会有一个[4,7]
                // if(i>start && nums[i]==nums[i-1] && used[i-1]){
                //     continue;
                // }
                //1、是否使用过 2、跟list最后一个比较大小
                if(!list.isEmpty() && nums[i]<list.get(list.size()-1) || used.contains(nums[i])){
                    continue;
                }
                used.add(nums[i]);
                list.add(nums[i]);
                backTracking(nums,i+1);
                list.removeLast();
            }
        }
    }
}
